/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.edu.fatec.ads.facade;

import br.edu.fatec.ads.bo.BusinessObjectCartao;
import br.edu.fatec.ads.bo.BusinessObjectEmprestimo;
import br.edu.fatec.ads.bo.BusinessObjectLivro;
import br.edu.fatec.ads.classes.Cartao;
import br.edu.fatec.ads.classes.Emprestimo;
import br.edu.fatec.ads.classes.Livro;
import java.util.Date;

/**
 *
 * @author Ubirajara
 */
public class FacadeEmprestimo {

    private BusinessObjectEmprestimo regraNegocio = null;
    private static FacadeEmprestimo singleton = null;

    private FacadeEmprestimo() {
        regraNegocio = new BusinessObjectEmprestimo();
    }

    public static FacadeEmprestimo getInstance(){
        if(singleton == null){
            singleton = new FacadeEmprestimo();
        }

        return singleton;
    }

    public void inserir(Emprestimo emprestimo)
        throws Exception{
        int codigoEmprestimo = 0;
        BusinessObjectCartao regraNegocioCartao = new BusinessObjectCartao();
        BusinessObjectLivro regraNegocioLivro = new BusinessObjectLivro();

        emprestimo.setDataEmprestimo(new Date());

        regraNegocio.beginTransaction();

        try{
            Cartao cartao = emprestimo.getCartao();

            if(regraNegocio.hasLessThan2Emprestimos(cartao)){
                emprestimo.setCartao(regraNegocioCartao.getCartao(cartao));

                codigoEmprestimo = regraNegocio.inserir(emprestimo);

                FacadeCartao.getInstance().setEmprestimo(codigoEmprestimo);

                Livro livro = regraNegocioLivro.getLivro(emprestimo.getLivro().getCodigo());
                livro.setEmprestado(true);

                regraNegocioLivro.updateLivro(livro);

                regraNegocio.commitTransaction();
            }else{
                throw new Exception("Não foi possível efetuar o empréstimo. A quantidade máxima de empréstimos por pessoa é de dois livros");
            }

        }catch(Exception cause){
            cause.printStackTrace();

            regraNegocio.rollbackTransaction();

            throw new Exception("Não foi possível efetuar o empréstimo. Tente novamente.");
        }
    }

}